﻿using System;
using System.Collections.Generic;

using Galaxy.Core;
using Galaxy.Loader;
using Galaxy.ModuleInterface;

namespace Galaxy
{
    /// <summary>Программа Галактика</summary>
    public static class Program
    {
        /// <summary>Ядро</summary>
        private static IGalaxyCore sf_Core;
        /// <summary>Загрузчик</summary>
        private static LoaderModule sf_LoaderModule;
        /// <summary>Поток ядра</summary>
        private static System.Threading.Thread sf_CoreThread;
        /// <summary>Объект блокировки основного потока</summary>
        private static System.Threading.AutoResetEvent sf_AutoResetEvent =
            new System.Threading.AutoResetEvent(false);

        /// <summary>Точка входа</summary>
        /// <param name="Arg">Строковые аргументы программы</param>
        [STAThread]
        public static void Main(params string[] Arg)
        {
            sf_Core = new GalaxyCore();
            sf_LoaderModule = new LoaderModule();
            
            sf_Core.AddModule(sf_LoaderModule);

            sf_LoaderModule.OnObjectLoaded += OnObjectLoaded;
            sf_LoaderModule.OnModuleLoaded += OnModuleLoaded;

            sf_Core.OnEnable += OnCoreEnable;

            sf_LoaderModule.Initialize();
            sf_LoaderModule.Start();
        

            sf_CoreThread = new System.Threading.Thread(sf_Core.Start);

            //sf_Core.AddModule(new Galaxy.TestModule.CMessageSender());

            sf_CoreThread.Start(); 
            sf_AutoResetEvent.WaitOne();
        }

        /// <summary>Обработка загрузки/остановки ядра</summary>
        /// <param name="Core">Запускаемое/останавливаемое ядро</param>
        /// <param name="Arg">Аргументы события</param>
        private static void OnCoreEnable(GalaxyCore Core, Galaxy.Core.Events.OnEnableEventArgs Arg)
        {
            if(!Arg.Enable)
                sf_AutoResetEvent.Set();
            Core.Enable = false;
        }

        /// <summary>Обработка события загрузки модуля</summary>
        /// <param name="LoaderModule">Загрузчик</param>
        /// <param name="Args">Аргументы события</param>
        private static void OnModuleLoaded(LoaderModule LoaderModule, OnModuleLoadedEventArgs Args)
        {
            if(Args.Module is IGalaxyCore) 
                return;
            sf_Core.AddModule(Args.Module);
        }

        /// <summary>Обработка загрузки объекта загрузчиком</summary>
        /// <param name="LoaderModule">Загрузчик</param>
        /// <param name="Args">Аргументы события</param>
        private static void OnObjectLoaded(LoaderModule LoaderModule, OnObjectLoadedEventArgs Args)
        {
            
        }
    }
}